package biblio.metier;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import biblio.exception.BiblioException;

public class EmpruntEnCours {
	private Date dateEmprunt;
	private Exemplaire exemplaire;
	private Utilisateur emprunteur;

	/**
	 * S'occupe des association avec Utilisateur et Exemplaire
	 * 
	 * @param dateEmprunt
	 * @param exemplaire
	 * @param emprunteur
	 * @throws BiblioException lève une exception si les conditions de prêts ne sont pas remplies
	 */
	public EmpruntEnCours(Date dateEmprunt, Exemplaire exemplaire,
			Utilisateur emprunteur) throws BiblioException {
		this.dateEmprunt = dateEmprunt;
		this.exemplaire = exemplaire;
		this.emprunteur = emprunteur;

		emprunteur.addEmpruntEnCours(this);
		exemplaire.setEmpruntEnCours(this);
	}

	public Exemplaire getExemplaire() {
		return exemplaire;
	}

	public void setExemplaire(Exemplaire exemplaire) {
		this.exemplaire = exemplaire;
	}

	public Utilisateur getEmprunteur() {
		return emprunteur;
	}

	public void setEmprunteur(Utilisateur emprunteur) {
		this.emprunteur = emprunteur;
	}

	public Date getDateEmprunt() {
		return dateEmprunt;
	}

	public void setDateEmprunt(Date d) {
		this.dateEmprunt = d;
	}

	public void retourEmprunt() {
		exemplaire.retourEmprunt();
		emprunteur.removeEmpruntEnCours(this);
	}

	public boolean isPretEnRetard() {
		GregorianCalendar dateDuJour = new GregorianCalendar();
		GregorianCalendar dateMax = new GregorianCalendar();

		dateDuJour.set(Calendar.HOUR_OF_DAY, 0);
		dateDuJour.set(Calendar.MINUTE, 0);
		dateDuJour.set(Calendar.SECOND, 0);
		dateDuJour.set(Calendar.MILLISECOND, 0);

		dateMax.setTime(this.dateEmprunt);
		dateMax.add(GregorianCalendar.DATE, 15);

		return dateDuJour.after(dateMax);
	}

	public EmpruntArchive createArchive() {
		return new EmpruntArchive(new Date(), dateEmprunt, emprunteur,
				exemplaire);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((dateEmprunt == null) ? 0 : dateEmprunt.hashCode());
		result = prime * result
				+ ((emprunteur == null) ? 0 : emprunteur.hashCode());
		result = prime * result
				+ ((exemplaire == null) ? 0 : exemplaire.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		EmpruntEnCours other = (EmpruntEnCours) obj;
		if (dateEmprunt == null) {
			if (other.dateEmprunt != null)
				return false;
		} else if (!dateEmprunt.equals(other.dateEmprunt))
			return false;
		if (emprunteur == null) {
			if (other.emprunteur != null)
				return false;
		} else if (!emprunteur.equals(other.emprunteur))
			return false;
		if (exemplaire == null) {
			if (other.exemplaire != null)
				return false;
		} else if (!exemplaire.equals(other.exemplaire))
			return false;
		return true;
	}

	public String toString(){
		if (emprunteur instanceof Employe){
			return("L'employ�: " + emprunteur.getNom() + " a emprunt� le livre r�f�renc� : " + exemplaire.getIdExemplaire());
		} else {
			return("L'adh�rent: " + emprunteur.getNom() + " a emprunt� le livre r�f�renc� : " + exemplaire.getIdExemplaire());
		}
	}
}